/* 路由鉴权,秋季安全,项目中路由能不能被的权限的设置(某一路有在什么条件下可以被访问,什么条件下不可用被访问) */
import router from './router/index.js'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
/* 全局路由守卫:项目中任意路由切换都会触发的钩子*/
/* 全局前置守卫 */
/* 引入pinia,不然会导致找不到仓库,要使用pinia的小仓库,首先要先调用大仓库的配置!~ */
import useUserStore, { filterAsyncRoute } from '@/store/modules/useUser.js'
import pinia from './store/index.js'
import setting from './setting.js'
import useUserlogOut from './store/modules/useUserlogOut.js'
import { cloneDeep } from 'lodash'
import { asnycRoute } from './router/routes.js'
export async function initRouter() {
  const userStore = useUserStore(pinia)
  if (userStore.token || localStorage.getItem('token')) {
    await userStore.userInfo()
  } else {
    return
  }
}

export function filter() {
  const userStore = useUserStore(pinia)

  const result = filterAsyncRoute(cloneDeep(asnycRoute), userStore.menuRoutes)
  return result
}

export function nprogressRouter() {
  router.beforeEach(async (to, from, next) => {
    /* to:你将要那个路由其中会有那个路由的对象
          form:你从哪个路由而来
          next:路由的放行函数
      */
    nprogress.start()
    const userStore = useUserStore(pinia)
    const userlogOutStore = useUserlogOut(pinia)
    const username = userStore.username
    let token = ''
    if (localStorage.getItem('token')) {
      token = localStorage.getItem('token')
    } else if (userStore.token) {
      token = userStore.token
    }

    /*
          逻辑 
          判断我们是否有带有token?没有话我们输入的地址是否login,是就放行,以上情况都不是,我们放行login网页,并且携带上次要跳转的网页路径
          如果我们有token
          我们的输入的是否是login路径,如果是我们会放行并跳转到首页
          如果我们有username用户名,也会放行
          以上情况都没有发生的情况下(也就是我们的token过期了)
          ,我们会获取向我们的仓库获取username随后放行,检查有没有成功获取,
          如果我们获取失败就会报错,从而被我们的try捕捉到,弹出到catch执行,清空我们的数据.跳转并且携带上次要跳转的网页路径
    */
    try {
      if (token) {
        if (to.path == '/login') {
          next({ path: '/' })
        } else if (username) {
          next()
          console.log(username)
        } else {
          await userStore.userInfo()
          if (filter()) {
            next()
          } else {
            next()
          }
        }
      } else if (to.path == '/login') {
        next()
      } else {
        next({ path: '/login', query: { redirect: to.path } })
      }
    } catch (error) {
      await userlogOutStore.userlogOut()
      next({ path: '/login', query: { redirect: to.path } })
      console.log(error)
    }
    console.log('前置路由被调用了')

    /*   三元写法
  try {
      token
        ? to.path == '/login'
          ? next({ path: '/' })
          : username
            ? next()
            : (await userStore.userInfo())
              ? next()
              :'错误'
        : to.path == '/login'
          ? next()
          : next({ path: '/login', query: { redirect: to.path } })
    } 
  catch (error) {
      console.log(error)
    } */
  })
  /* 全局后置守卫 */
  router.afterEach((to, from) => {
    /* 设置我们浏览器的标签.... */
    document.title = `${setting.title}-${to.meta.title}`
    nprogress.done()
    console.log('后置路由被调用了')
  })
}

/* 
我们需要让我们的路由在有token的时候进行放行除了login的全部路由,而没有的时候进行判断,放行进入login的请求,其他的全部拒绝
*/
